package Dome1;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DickYang
 * Date: 2023-05-08
 * Time: 9:10
 */

//多态需要满足的三个条件:继承 重写:父类的引用调用子类重写父类的方法 向上转型
//向上转型:发生向上转型后父类只能访问自己的成员不能访问子类特有的成员!!
//动态绑定,父类引用可以访问子类重写父类的方法!! 多态的基础
//多态:当父类的引用所指向的对象不同的时候,表现出的行为是不一样的!!
    //重写:返回类型,方法名,参数 一样
    //重写需要注意的点: 1.非Static 非final 非private 修饰的方法 2,子类的访问权限要大于父类的访问权限

class Animal {
    public String name;
    public int age;

    public void eat() {
        System.out.println(name + " 正在吃饭!");
    }
}
class Dog extends Animal {
    public void cry() {
        System.out.println(name + "正在汪汪叫!");
    }
    @Override //重写的注解
    public void eat() {//重写父类的方法
        System.out.println(name + "正在吃狗粮!");
    }
}
class Bird extends Animal {
    public void fly() {
        System.out.println(name + "正在飞!");
    }
    @Override//重写的注解
    public void eat() {//重写父类的方法
        System.out.println(name + "正在吃鸟粮!");
    }
}


public class TestDome2 {

    public static void funcTion (Animal animal) {
        //多态:当父类的引用所指向的对象不同的时候,表现出的行为是不一样的!!!
        animal.eat();
    }
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "十一月";
        funcTion(dog);
        System.out.println("==========");
        Animal animal1 = new Bird();
        animal1.name = "飞机";
        funcTion(animal1);
    }

    public static void main2(String[] args) {
        Animal animal = new Dog();
        animal.name = "十一月";
        animal.eat(); //此时发生的是动态绑定,父类引用可以访问子类重写父类的方法,

        System.out.println("==========");

        Animal animal1 = new Bird();
        animal1.name = "飞机";
        animal1.eat(); //此时发生的是动态绑定,父类引用可以访问子类重写父类的方法,
    }

    public static void func1(Animal animal) {
        //...
    }

    public static Animal func2() {
        return new Dog();//向上转型
    }
    public static void main1(String[] args) {
        Animal animal = new Dog();//向上转型  //前提:需要构成父子类关系!!
        animal.name = "坦克";
        animal.eat();
//        animal.cry();   //向上转型后,父类的引用只能访问父类自己的成员,不能访问子类特有的成员!!!

        Dog dog = new Dog();
        func1(dog);//向上转型

    }
}
